package main

import "fmt"
import "math/rand"
import "time"
import "sort"

func main() {

    data := [...]int{0, 1, 2, 3, 4, 10: 0}
    // 三段式切片：a[low:high:max] , 第三个表示切出来的容量
    s := data[:2:3]

    s = append(s, 100) // 一次 append 两个值，超出 s.cap 限制。

    fmt.Println(s, data)         // 重新分配底层数组，与原数组无关。
    fmt.Println(&s[0], &data[0]) // 比对底层数组起始指针。

    data2 := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println("array data : ", data2)
    s1 := data2[8:]
    fmt.Printf("slice s1 : %v\n", s1)

    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)

    // scoreMap := make(map[string]int)
    // scoreMap["张三"] = 90
    // scoreMap["小明"] = 100
    // // 如果key存在ok为true,v为对应的值；不存在ok为false,v为值类型的零值
    // v, ok := scoreMap["张三"]
    // if ok {
    //     fmt.Println(v)
    // } else {
    //     fmt.Println("查无此人")
    // }

    rand.Seed(time.Now().UnixNano()) //初始化随机数种子

    var scoreMap = make(map[string]int, 200)

    for i := 0; i < 100; i++ {
        key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
        value := rand.Intn(100)          //生成0~99的随机整数
        scoreMap[key] = value
    }
    //取出map中的所有key存入切片keys
    var keys = make([]string, 0, 200)
    for key := range scoreMap {
        keys = append(keys, key)
    }
    //对切片进行排序
    sort.Strings(keys)
    //按照排序后的key遍历map
    for _, key := range keys {
        fmt.Println(key, scoreMap[key])
    }


    var mapSlice = make([]map[string]string, 3)
    for index, value := range mapSlice {
        fmt.Printf("index:%d value:%v\n", index, value)
    }
    fmt.Println("after init")
    // 对切片中的map元素进行初始化
    mapSlice[0] = make(map[string]string, 10)
    mapSlice[0]["name"] = "王五"
    mapSlice[0]["password"] = "123456"
    mapSlice[0]["address"] = "红旗大街"
    for index, value := range mapSlice {
        fmt.Printf("index:%d value:%v\n", index, value)
    }

    p1 := getPerson("测试", 25)
    p1.Dream()
    fmt.Println(p1.age) // 25
    p1.setAge(30)
    fmt.Println(p1.age) // 30
}

type Person struct {
    name string
    age int
}

// 构造函数
func getPerson(name string, age int) *Person{
    return &Person{name: name, age: age}
}

// 成员方法
func (p Person) Dream() {
    fmt.Printf("%s的梦想是学好Go语言", p.name)
}

// set get
func (p *Person) setAge(newAge int) {
    p.age = newAge
}